#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : booksource_modules.py
# @Author: Xuhao
# @Date  : 2018/3/16
# @Desc  : 

from app.Sql.SQLSession import Base,DataBaseConnector
from sqlalchemy import Column, String, Integer,ForeignKey
import json

from sqlalchemy.ext.declarative import DeclarativeMeta
#定义小说来源表
class BookSource(Base):
    __tablename__ = 'bookSource'
    __table_args__ = {"extend_existing": True}
    id = Column(Integer, primary_key=True, autoincrement=True)
    bookID = Column(String(32), ForeignKey('NoverInfo.noveID'), index=True)
    bookUrl = Column(String(128))

    @classmethod
    def fetchBookSource(cls, bookID):
        '''
        根据小说ID 获取小说来源
        :param bookName:
        :param bookAtuhor:
        :return:
        '''

        connect = DataBaseConnector()

        session = connect.get_session()

        bookSource = session.query(BookSource).filter(BookSource.bookID == bookID).order_by(BookSource.id.desc()).all()

        connect.close()

        return json.dumps(bookSource, cls=new_alchemy_encoder(False))


def new_alchemy_encoder(revisit_self=False, fields_to_expand=[]):
    _visited_objs = []

    class AlchemyEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj.__class__, DeclarativeMeta):
                # don't re-visit self
                if revisit_self:
                    if obj in _visited_objs:
                        return None
                    _visited_objs.append(obj)

                # go through each field in this SQLalchemy class
                fields = {}
                for field in [x for x in dir(obj) if
                              not x.startswith('_') and x != 'metadata' and hasattr(obj.__getattribute__(x),
                                                                                    '__call__') == False]:
                    val = obj.__getattribute__(field)

                    # is this field another SQLalchemy object, or a list of SQLalchemy objects?
                    if isinstance(val.__class__, DeclarativeMeta) or (
                                    isinstance(val, list) and len(val) > 0 and isinstance(val[0].__class__,
                                                                                          DeclarativeMeta)):
                        # unless we're expanding this field, stop here
                        if field not in fields_to_expand:
                            # not expanding this field: set it to None and continue
                            fields[field] = None
                            continue

                    fields[field] = val
                # a json-encodable dict
                return fields

            return json.JSONEncoder.default(self, obj)

    return AlchemyEncoder
if __name__ == "__main__":

    bookID = 'f5bffd224e6343589d91eb02527b661a'
    connect = DataBaseConnector()

    session = connect.get_session()
    bookinfo = session.query(BookSource).filter(BookSource.bookID == bookID).order_by(BookSource.bookUrl.desc()).all()
    print(json.dumps(bookinfo, cls=new_alchemy_encoder(False, )))